#ifndef IGSLIB_IBUTTON_H
#define IGSLIB_IBUTTON_H

#include "igslib_common_use.h"
#include "igslib_igpio.h"

namespace igslib
{
    struct IButton;
    struct IButtonEvent
    {
        /*!
         * 當狀態發生變化時觸發。
         * @param a0 事件容器(擁有者)。
         * @param a1 舊值。
         * @param a2 新值。
         */
        virtual void OnChangeState(IButton*,bool,bool)=0;
    };
	struct IButton:public IComponent
	{
        /*!
         * 取得是否被按著的狀態。
         * @return true表示被按著。
         */
        virtual bool IsPressed()=0;
        /*!
         * 取得是否為第一次被按下。
         * @return true表示第一次被按下。
         */
        virtual bool IsPressDown()=0;
        /*!
         * 設定相關事件處理者。
         * @param a0 相關事件處理者。
         */
        virtual void SetEventHandler(IButtonEvent*)=0;
        /*!
         * 取得按鈕名稱。
         * @return 按鈕名稱。
         */
		virtual std::string GetName()=0;
        /*!
         * 設定按鈕名稱。
         * @param a0 按鈕名稱。
         */
        virtual void SetName(const std::string&)=0;
	};

    struct IGPIOButton:virtual public IButton
    {
        /*!
         * 對於一個以GPIO實作的按鈕，用此函式設定IGPIO的實體。
         * @param a0 IGPIO的實體。
         */
        virtual void SetGPIO(IGPIO*)=0;
    };

    struct IButtonManager:public IManager<IButton*>
    {
        /*!
         * 創建一個模擬用GPIO按鈕。
         * @return 模擬用GPIO按鈕。
         */
        virtual IGPIOButton* NewGPIOButton()=0;
        /*!
         * 更新所有按鈕狀態。
         */
		virtual void Update()=0;
    };
};

extern "C"
{
    igslib::IButtonManager* GetButtonManagerInstance();
};
#endif
